package sword_offer;

/**
 * @author Synhard
 * @version 1.0
 * @class Code61
 * @description 剑指 Offer 56 - I. 数组中数字出现的次数
 * 一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)，空间复杂度是O(1)。
 *
 * 示例 1：
 *
 * 输入：nums = [4,1,4,6]
 * 输出：[1,6] 或 [6,1]
 * 示例 2：
 *
 * 输入：nums = [1,2,10,4,1,4,3,3]
 * 输出：[2,10] 或 [10,2]
 *
 * 限制：
 *
 * 2 <= nums.length <= 10000
 *
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-07-15 8:06
 */
public class Code61 {
    public static void main(String[] args) {

    }

    public int[] singleNumbers(int[] nums) {
        int xorAll = 0;
        for (int num : nums) {
            xorAll ^= num;
        }
        int diff = 0;
        while ((xorAll & 1) != 1) {
            xorAll >>= 1;
            diff++;
        }
        int a = 0, b = 0;
        for (int num : nums) {
            if ((num >> diff & 1) == 1) {
                a ^= num;
                continue;
            }
            b ^= num;
        }
        return new int[]{a, b};
    }
}
/*
分组异或
 */